#pragma once
#include "stock_analyzer_data_struct.h"


#ifdef stock_analyzer_2_EXPORTS
#define stock_analyzer_2_API __declspec(dllexport)
#else
#define stock_analyzer_2_API __declspec(dllimport)
#endif


// // 回调函数类型定义
// typedef void (*BuyCallback)(int quantity, double price);
// typedef void (*SellCallback)(int quantity, double price);

struct buy_or_sell
{
    bool buy = false;
    bool sell = false;
    double price = 0;
    float arrange_value = 0;
};

// 大涨前的特征
// (取15日左右的特征数据来判断)
struct before_big_rise_trait
{
    // 在120均线以下
    bool price_less_than_ma120=false;
    // MACD的活跃度从1以下向1靠进
    bool macd_depart_speed_up_and_close_to_one=false;
    // 有缩量下跌 
    bool has_small_volume_sellout=false;
    // 连续背离天数
    size_t macd_depart_speed_up_days=0;
    // 大涨前15天内最大背离值
    double max_macd_depart_value_in_15_days=0;
};

// 用于记录大涨前特征的状态机,用于把记录限制在15天
struct before_big_rise_trait_record_state
{
    // 在120均线以下
    uint8_t price_less_than_ma120=0;
    // MACD的活跃度从1以下向1靠进
    uint8_t macd_depart_speed_up_and_close_to_one=0;
    // 有缩量下跌 
    uint8_t has_small_volume_sellout=0;
    // 连续背离天数
    uint8_t macd_depart_speed_up_days=0;
    // 大涨前15天内最大背离值
    uint8_t max_macd_depart_value_in_15_days=0;
    // 上一个macd值
    double last_macd_activity_rate=1;
};

/**
 * 与每只股票一一对应, 用于分析出买入点和卖出点
 * 分析出来的数据, 供仓位调整模块使用
 */
class stock_analyzer_2_API stock_analyzer_2 {
public:
    stock_analyzer_2();
    /**
     * 分析当天的数据, 分析出买入点和卖出点
     */
    buy_or_sell adjustPosition(const stock_analyzer_data* data);

    /**
     * 取这只股票的胜率
     */
    double getWinRate();

    /**
     * 取盈利比率
     * 如果有赚钱, 赚钱的比例是多少
     */
    double getProfitRatio();

    /**
     * 取亏损比例
     */
    double getLossRatio();
    
    /**
     * 取大涨点:
     */
    const std::vector<std::string> &getBigRiseTime() const; 
    /**
     * 取对应的特征
     */
    const std::vector<before_big_rise_trait> &getBeforeBigRiseTraitRecord() const;
    /**
     * 赚了多少:
     */
    const double getProfit() const;
    /**
     * 买卖点
     */
    const std::vector<std::string> &getBuyAndSell() const;
    /**
     * 卖入或卖出
     */
    const std::vector<int> &getBuyOrSell() const;
    /**
     * 一开始就持股,以能让算法计算卖出点
     */
    void setStartHold();
    /**
     * 在初始化时,设置买入栈
     */
    void setBuyStack(double price,size_t quantity);
private:
    size_t m_inner_data=0;    // 内部数据, 用于存储分析出来的数据
    // 大涨判断:
    bool m_is_big_rise = false;
    // 记录大涨的时间点:
    std::vector<std::string> m_big_rise_time;
    // 记录大涨前的特征
    before_big_rise_trait m_before_big_rise_trait;
    // 记录过程中的状态机
    before_big_rise_trait_record_state m_before_big_rise_trait_record_state;
    // 大涨前的特征记录:
    std::vector<before_big_rise_trait> m_before_big_rise_trait_record;
    // 记录买入点与卖出点:
    std::vector<std::string> m_buy_and_sell;
    // 记录买入或卖出
    std::vector<int> m_buy_or_sell;
};
